#include "msgqueuelock.h"

void init_msg(struct Msgqueue *msg)
{
    int res = sem_init(&bin_sem,0,1);//初始化锁，用其它实现方式亦可
    if(res != 0)
        printf("信号量创建失败");
    (*msg).head = 0;
    (*msg).tail = 0;
}
int full_msg(struct Msgqueue *msg)
{
    return ((((*msg).tail+1) % (I_MAX+1)) == (*msg).head);
}
int empty_msg(struct Msgqueue *msg)
{
   //printf("%d\n",(*msg).tail == (*msg).head);如果为空返回1
    return ((*msg).tail == (*msg).head);
}
void add_pkg(struct Msgqueue * msg,const struct Package *pack)
{
    sem_wait(&bin_sem);
    if(full_msg(msg)){
        //printf("full\n");
        return ;
    }
    (*msg).age[(*msg).tail%I_MAX] = *pack;
    (*msg).tail++;
    //printf("add\n");
    sem_post(&bin_sem);//锁变量，唯有收到好友列表信息，在主界面才能继续，见97行代码
}
void ret_pkg(struct Msgqueue *msg,struct Package *pack)
{
    sem_wait(&bin_sem);
    if(empty_msg(msg))
    {  return ;}
    (*pack) = (*msg).age[(*msg).head%I_MAX];
    sem_post(&bin_sem);
}
void ret_dele_pkg(struct Msgqueue *msg,struct Package *pack)
{
    sem_wait(&bin_sem);
    if(empty_msg(msg))//如果头尾一致，
    { return; }
    (*pack) = (*msg).age[(*msg).head%I_MAX];
    (*msg).head++;
    sem_post(&bin_sem);//锁变量，唯有收到好友列表信息，在主界面才能继续，见97行代码
}
